package com.tom.architect.party4.day33.simple2;

import com.google.gson.Gson;

import java.lang.reflect.ParameterizedType;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

// 使用泛型，简化bean的解析。 <T>、 <Result<T>>
// 解决后台返回数据格式不一致问题。
public abstract class HttpCallback<T> implements Callback<Result<T>> {

    @Override
    public void onResponse(Call<Result<T>> call, Response<Result<T>> response) {
        // 拿到返回的整体数据
        Result<T> result = response.body();
        if (!result.isOk()) { // ======统一集中比较服务器返回的 code码。统一处理异常分支逻辑。======
            onError(result.code, result.msg); // 错误：回调出去。
            return;
        }

        // ****正常流程：解析类Bean。反射 获取类 HttpCallback 上面的泛型  T 。*****
        Class<T> entityClass = (Class<T>) ((ParameterizedType)
                this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        Gson gson = new Gson();
        // 拿到data，泛型转class，最终转成data对象。
        T data = gson.fromJson(result.data.toString(), entityClass);
        onSucceed(data); // data 回调传回去。
    }

    @Override
    public void onFailure(Call<Result<T>> call, Throwable t) {
        // TODO 处理失败：联网失败，解析出错..。
        //  onError();
    }

    // 成功：泛型回调数据出去
    protected abstract void onSucceed(T result);
    // 失败回调接口
    protected abstract void onError(String code, String msg);
}
